Mein Dashboard

import pandas as pd
import plotly.express as px
import ipywidgets as widgets
from IPython.display import display

# -------------------------------------------------
# Daten laden & bereinigen (wie in deinen anderen Blöcken)
# -------------------------------------------------
CSV_PATH = "World-Heritage-2025.csv"
df = pd.read_csv(CSV_PATH)
df["date_inscribed"] = pd.to_numeric(df["date_inscribed"],
                                     errors="coerce").astype("Int64")
df = df.dropna(subset=["name_en","date_inscribed","category",
                       "latitude","longitude"]).reset_index(drop=True)

# -------------------------------------------------
# Widgets definieren
# -------------------------------------------------
cat_options = sorted(df["category"].unique())
cat_widget = widgets.SelectMultiple(
    options=cat_options,
    value=cat_options,               # voreingestellt: alles ausgewählt
    description='Kategorie:',
    rows=6,
    layout=widgets.Layout(width='250px')
)

year_range = (int(df["date_inscribed"].min()),
              int(df["date_inscribed"].max()))
year_slider = widgets.IntRangeSlider(
    value=year_range,
    min=year_range[0],
    max=year_range[1],
    step=1,
    description='Jahre:',
    continuous_update=False,
    layout=widgets.Layout(width='400px')
)

# -------------------------------------------------
# Update‑Funktion: erzeugt das Plotly‑Figure
# -------------------------------------------------
def update_plot(change=None):
    # Filter anwenden
    filtered = df[
        (df["category"].isin(cat_widget.value)) &
        (df["date_inscribed"] >= year_slider.value[0]) &
        (df["date_inscribed"] <= year_slider.value[1])
    ]
    # Scatter‑Karte (kann natürlich jede andere Figure sein)
    fig = px.scatter_geo(
        filtered,
        lat="latitude",
        lon="longitude",
        hover_name="name_en",
        color="category",
        projection="natural earth",
        title="UNESCO‑Welterbestätten (gefiltert)"
    )
    fig.update_layout(width=850, height=460, margin=dict(l=0, r=0, t=40, b=0))
    fig.show()

# -------------------------------------------------
# Beobachter registrieren (wird bei jeder Änderung getriggert)
# -------------------------------------------------
cat_widget.observe(update_plot, names='value')
year_slider.observe(update_plot, names='value')

# -------------------------------------------------
# Layout: Sidebar + Plot
# -------------------------------------------------
sidebar = widgets.VBox([cat_widget, year_slider])
display(sidebar)

# Initiales Plot
update_plot()